In [1]:
import os
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.models import load_model, Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.resnet50 import preprocess_input
import cv2
In [2]:
# Load the ResNet model
resnet_model = load_model('Final_InceptionV3_model.h5')
print(resnet_model.summary())
# Load the dataset CSV file
df = pd.read_csv("DataSet/HAM.csv")
# Add file extensions to image IDs
df['image_id'] = df['image_id'].apply(lambda x: x + ".jpg")
# Define image size and batch size
img_size = (200, 200)
batch_size = 16
# Create data generators for augmentation
datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True,
zoom_range=0.2
)
# Sample 4 images from each class for testing
test_images = []
classes = df['dx'].unique()
for lesion_type in classes:
sample_images = df[df['dx'] == lesion_type]['image_id'].sample(4, random_state=42)
test_images.extend(sample_images)
# Define class names for target labels
class_names = {
'akiec': 'Actinic Keratosis',
'bcc': 'Basal Cell Carcinoma',
'bkl': 'Benign Keratosis',
'df': 'Dermatofibroma',
'mel': 'Melanoma',
'nv': 'Melanocytic Nevi',
'vasc': 'Vascular Lesions'
}
Model: "model_2"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_7 (InputLayer) [(None, 200, 200, 3 0 []
)]
conv2d_568 (Conv2D) (None, 99, 99, 32) 864 ['input_7[0][0]']
batch_normalization_567 (Batch (None, 99, 99, 32) 96 ['conv2d_568[0][0]']
Normalization)
activation_564 (Activation) (None, 99, 99, 32) 0 ['batch_normalization_567[0][0]']
conv2d_569 (Conv2D) (None, 97, 97, 32) 9216 ['activation_564[0][0]']
batch_normalization_568 (Batch (None, 97, 97, 32) 96 ['conv2d_569[0][0]']
Normalization)
activation_565 (Activation) (None, 97, 97, 32) 0 ['batch_normalization_568[0][0]']
conv2d_570 (Conv2D) (None, 97, 97, 64) 18432 ['activation_565[0][0]']
batch_normalization_569 (Batch (None, 97, 97, 64) 192 ['conv2d_570[0][0]']
Normalization)
activation_566 (Activation) (None, 97, 97, 64) 0 ['batch_normalization_569[0][0]']
max_pooling2d_24 (MaxPooling2D (None, 48, 48, 64) 0 ['activation_566[0][0]']
)
conv2d_571 (Conv2D) (None, 48, 48, 80) 5120 ['max_pooling2d_24[0][0]']
batch_normalization_570 (Batch (None, 48, 48, 80) 240 ['conv2d_571[0][0]']
Normalization)
activation_567 (Activation) (None, 48, 48, 80) 0 ['batch_normalization_570[0][0]']
conv2d_572 (Conv2D) (None, 46, 46, 192) 138240 ['activation_567[0][0]']
batch_normalization_571 (Batch (None, 46, 46, 192) 576 ['conv2d_572[0][0]']
Normalization)
activation_568 (Activation) (None, 46, 46, 192) 0 ['batch_normalization_571[0][0]']
max_pooling2d_25 (MaxPooling2D (None, 22, 22, 192) 0 ['activation_568[0][0]']
)
conv2d_576 (Conv2D) (None, 22, 22, 64) 12288 ['max_pooling2d_25[0][0]']
batch_normalization_575 (Batch (None, 22, 22, 64) 192 ['conv2d_576[0][0]']
Normalization)
activation_572 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_575[0][0]']
conv2d_574 (Conv2D) (None, 22, 22, 48) 9216 ['max_pooling2d_25[0][0]']
conv2d_577 (Conv2D) (None, 22, 22, 96) 55296 ['activation_572[0][0]']
batch_normalization_573 (Batch (None, 22, 22, 48) 144 ['conv2d_574[0][0]']
Normalization)
batch_normalization_576 (Batch (None, 22, 22, 96) 288 ['conv2d_577[0][0]']
Normalization)
activation_570 (Activation) (None, 22, 22, 48) 0 ['batch_normalization_573[0][0]']
activation_573 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_576[0][0]']
average_pooling2d_54 (AverageP (None, 22, 22, 192) 0 ['max_pooling2d_25[0][0]']
ooling2D)
conv2d_573 (Conv2D) (None, 22, 22, 64) 12288 ['max_pooling2d_25[0][0]']
conv2d_575 (Conv2D) (None, 22, 22, 64) 76800 ['activation_570[0][0]']
conv2d_578 (Conv2D) (None, 22, 22, 96) 82944 ['activation_573[0][0]']
conv2d_579 (Conv2D) (None, 22, 22, 32) 6144 ['average_pooling2d_54[0][0]']
batch_normalization_572 (Batch (None, 22, 22, 64) 192 ['conv2d_573[0][0]']
Normalization)
batch_normalization_574 (Batch (None, 22, 22, 64) 192 ['conv2d_575[0][0]']
Normalization)
batch_normalization_577 (Batch (None, 22, 22, 96) 288 ['conv2d_578[0][0]']
Normalization)
batch_normalization_578 (Batch (None, 22, 22, 32) 96 ['conv2d_579[0][0]']
Normalization)
activation_569 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_572[0][0]']
activation_571 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_574[0][0]']
activation_574 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_577[0][0]']
activation_575 (Activation) (None, 22, 22, 32) 0 ['batch_normalization_578[0][0]']
mixed0 (Concatenate) (None, 22, 22, 256) 0 ['activation_569[0][0]',
'activation_571[0][0]',
'activation_574[0][0]',
'activation_575[0][0]']
conv2d_583 (Conv2D) (None, 22, 22, 64) 16384 ['mixed0[0][0]']
batch_normalization_582 (Batch (None, 22, 22, 64) 192 ['conv2d_583[0][0]']
Normalization)
activation_579 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_582[0][0]']
conv2d_581 (Conv2D) (None, 22, 22, 48) 12288 ['mixed0[0][0]']
conv2d_584 (Conv2D) (None, 22, 22, 96) 55296 ['activation_579[0][0]']
batch_normalization_580 (Batch (None, 22, 22, 48) 144 ['conv2d_581[0][0]']
Normalization)
batch_normalization_583 (Batch (None, 22, 22, 96) 288 ['conv2d_584[0][0]']
Normalization)
activation_577 (Activation) (None, 22, 22, 48) 0 ['batch_normalization_580[0][0]']
activation_580 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_583[0][0]']
average_pooling2d_55 (AverageP (None, 22, 22, 256) 0 ['mixed0[0][0]']
ooling2D)
conv2d_580 (Conv2D) (None, 22, 22, 64) 16384 ['mixed0[0][0]']
conv2d_582 (Conv2D) (None, 22, 22, 64) 76800 ['activation_577[0][0]']
conv2d_585 (Conv2D) (None, 22, 22, 96) 82944 ['activation_580[0][0]']
conv2d_586 (Conv2D) (None, 22, 22, 64) 16384 ['average_pooling2d_55[0][0]']
batch_normalization_579 (Batch (None, 22, 22, 64) 192 ['conv2d_580[0][0]']
Normalization)
batch_normalization_581 (Batch (None, 22, 22, 64) 192 ['conv2d_582[0][0]']
Normalization)
batch_normalization_584 (Batch (None, 22, 22, 96) 288 ['conv2d_585[0][0]']
Normalization)
batch_normalization_585 (Batch (None, 22, 22, 64) 192 ['conv2d_586[0][0]']
Normalization)
activation_576 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_579[0][0]']
activation_578 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_581[0][0]']
activation_581 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_584[0][0]']
activation_582 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_585[0][0]']
mixed1 (Concatenate) (None, 22, 22, 288) 0 ['activation_576[0][0]',
'activation_578[0][0]',
'activation_581[0][0]',
'activation_582[0][0]']
conv2d_590 (Conv2D) (None, 22, 22, 64) 18432 ['mixed1[0][0]']
batch_normalization_589 (Batch (None, 22, 22, 64) 192 ['conv2d_590[0][0]']
Normalization)
activation_586 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_589[0][0]']
conv2d_588 (Conv2D) (None, 22, 22, 48) 13824 ['mixed1[0][0]']
conv2d_591 (Conv2D) (None, 22, 22, 96) 55296 ['activation_586[0][0]']
batch_normalization_587 (Batch (None, 22, 22, 48) 144 ['conv2d_588[0][0]']
Normalization)
batch_normalization_590 (Batch (None, 22, 22, 96) 288 ['conv2d_591[0][0]']
Normalization)
activation_584 (Activation) (None, 22, 22, 48) 0 ['batch_normalization_587[0][0]']
activation_587 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_590[0][0]']
average_pooling2d_56 (AverageP (None, 22, 22, 288) 0 ['mixed1[0][0]']
ooling2D)
conv2d_587 (Conv2D) (None, 22, 22, 64) 18432 ['mixed1[0][0]']
conv2d_589 (Conv2D) (None, 22, 22, 64) 76800 ['activation_584[0][0]']
conv2d_592 (Conv2D) (None, 22, 22, 96) 82944 ['activation_587[0][0]']
conv2d_593 (Conv2D) (None, 22, 22, 64) 18432 ['average_pooling2d_56[0][0]']
batch_normalization_586 (Batch (None, 22, 22, 64) 192 ['conv2d_587[0][0]']
Normalization)
batch_normalization_588 (Batch (None, 22, 22, 64) 192 ['conv2d_589[0][0]']
Normalization)
batch_normalization_591 (Batch (None, 22, 22, 96) 288 ['conv2d_592[0][0]']
Normalization)
batch_normalization_592 (Batch (None, 22, 22, 64) 192 ['conv2d_593[0][0]']
Normalization)
activation_583 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_586[0][0]']
activation_585 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_588[0][0]']
activation_588 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_591[0][0]']
activation_589 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_592[0][0]']
mixed2 (Concatenate) (None, 22, 22, 288) 0 ['activation_583[0][0]',
'activation_585[0][0]',
'activation_588[0][0]',
'activation_589[0][0]']
conv2d_595 (Conv2D) (None, 22, 22, 64) 18432 ['mixed2[0][0]']
batch_normalization_594 (Batch (None, 22, 22, 64) 192 ['conv2d_595[0][0]']
Normalization)
activation_591 (Activation) (None, 22, 22, 64) 0 ['batch_normalization_594[0][0]']
conv2d_596 (Conv2D) (None, 22, 22, 96) 55296 ['activation_591[0][0]']
batch_normalization_595 (Batch (None, 22, 22, 96) 288 ['conv2d_596[0][0]']
Normalization)
activation_592 (Activation) (None, 22, 22, 96) 0 ['batch_normalization_595[0][0]']
conv2d_594 (Conv2D) (None, 10, 10, 384) 995328 ['mixed2[0][0]']
conv2d_597 (Conv2D) (None, 10, 10, 96) 82944 ['activation_592[0][0]']
batch_normalization_593 (Batch (None, 10, 10, 384) 1152 ['conv2d_594[0][0]']
Normalization)
batch_normalization_596 (Batch (None, 10, 10, 96) 288 ['conv2d_597[0][0]']
Normalization)
activation_590 (Activation) (None, 10, 10, 384) 0 ['batch_normalization_593[0][0]']
activation_593 (Activation) (None, 10, 10, 96) 0 ['batch_normalization_596[0][0]']
max_pooling2d_26 (MaxPooling2D (None, 10, 10, 288) 0 ['mixed2[0][0]']
)
mixed3 (Concatenate) (None, 10, 10, 768) 0 ['activation_590[0][0]',
'activation_593[0][0]',
'max_pooling2d_26[0][0]']
conv2d_602 (Conv2D) (None, 10, 10, 128) 98304 ['mixed3[0][0]']
batch_normalization_601 (Batch (None, 10, 10, 128) 384 ['conv2d_602[0][0]']
Normalization)
activation_598 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_601[0][0]']
conv2d_603 (Conv2D) (None, 10, 10, 128) 114688 ['activation_598[0][0]']
batch_normalization_602 (Batch (None, 10, 10, 128) 384 ['conv2d_603[0][0]']
Normalization)
activation_599 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_602[0][0]']
conv2d_599 (Conv2D) (None, 10, 10, 128) 98304 ['mixed3[0][0]']
conv2d_604 (Conv2D) (None, 10, 10, 128) 114688 ['activation_599[0][0]']
batch_normalization_598 (Batch (None, 10, 10, 128) 384 ['conv2d_599[0][0]']
Normalization)
batch_normalization_603 (Batch (None, 10, 10, 128) 384 ['conv2d_604[0][0]']
Normalization)
activation_595 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_598[0][0]']
activation_600 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_603[0][0]']
conv2d_600 (Conv2D) (None, 10, 10, 128) 114688 ['activation_595[0][0]']
conv2d_605 (Conv2D) (None, 10, 10, 128) 114688 ['activation_600[0][0]']
batch_normalization_599 (Batch (None, 10, 10, 128) 384 ['conv2d_600[0][0]']
Normalization)
batch_normalization_604 (Batch (None, 10, 10, 128) 384 ['conv2d_605[0][0]']
Normalization)
activation_596 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_599[0][0]']
activation_601 (Activation) (None, 10, 10, 128) 0 ['batch_normalization_604[0][0]']
average_pooling2d_57 (AverageP (None, 10, 10, 768) 0 ['mixed3[0][0]']
ooling2D)
conv2d_598 (Conv2D) (None, 10, 10, 192) 147456 ['mixed3[0][0]']
conv2d_601 (Conv2D) (None, 10, 10, 192) 172032 ['activation_596[0][0]']
conv2d_606 (Conv2D) (None, 10, 10, 192) 172032 ['activation_601[0][0]']
conv2d_607 (Conv2D) (None, 10, 10, 192) 147456 ['average_pooling2d_57[0][0]']
batch_normalization_597 (Batch (None, 10, 10, 192) 576 ['conv2d_598[0][0]']
Normalization)
batch_normalization_600 (Batch (None, 10, 10, 192) 576 ['conv2d_601[0][0]']
Normalization)
batch_normalization_605 (Batch (None, 10, 10, 192) 576 ['conv2d_606[0][0]']
Normalization)
batch_normalization_606 (Batch (None, 10, 10, 192) 576 ['conv2d_607[0][0]']
Normalization)
activation_594 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_597[0][0]']
activation_597 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_600[0][0]']
activation_602 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_605[0][0]']
activation_603 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_606[0][0]']
mixed4 (Concatenate) (None, 10, 10, 768) 0 ['activation_594[0][0]',
'activation_597[0][0]',
'activation_602[0][0]',
'activation_603[0][0]']
conv2d_612 (Conv2D) (None, 10, 10, 160) 122880 ['mixed4[0][0]']
batch_normalization_611 (Batch (None, 10, 10, 160) 480 ['conv2d_612[0][0]']
Normalization)
activation_608 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_611[0][0]']
conv2d_613 (Conv2D) (None, 10, 10, 160) 179200 ['activation_608[0][0]']
batch_normalization_612 (Batch (None, 10, 10, 160) 480 ['conv2d_613[0][0]']
Normalization)
activation_609 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_612[0][0]']
conv2d_609 (Conv2D) (None, 10, 10, 160) 122880 ['mixed4[0][0]']
conv2d_614 (Conv2D) (None, 10, 10, 160) 179200 ['activation_609[0][0]']
batch_normalization_608 (Batch (None, 10, 10, 160) 480 ['conv2d_609[0][0]']
Normalization)
batch_normalization_613 (Batch (None, 10, 10, 160) 480 ['conv2d_614[0][0]']
Normalization)
activation_605 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_608[0][0]']
activation_610 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_613[0][0]']
conv2d_610 (Conv2D) (None, 10, 10, 160) 179200 ['activation_605[0][0]']
conv2d_615 (Conv2D) (None, 10, 10, 160) 179200 ['activation_610[0][0]']
batch_normalization_609 (Batch (None, 10, 10, 160) 480 ['conv2d_610[0][0]']
Normalization)
batch_normalization_614 (Batch (None, 10, 10, 160) 480 ['conv2d_615[0][0]']
Normalization)
activation_606 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_609[0][0]']
activation_611 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_614[0][0]']
average_pooling2d_58 (AverageP (None, 10, 10, 768) 0 ['mixed4[0][0]']
ooling2D)
conv2d_608 (Conv2D) (None, 10, 10, 192) 147456 ['mixed4[0][0]']
conv2d_611 (Conv2D) (None, 10, 10, 192) 215040 ['activation_606[0][0]']
conv2d_616 (Conv2D) (None, 10, 10, 192) 215040 ['activation_611[0][0]']
conv2d_617 (Conv2D) (None, 10, 10, 192) 147456 ['average_pooling2d_58[0][0]']
batch_normalization_607 (Batch (None, 10, 10, 192) 576 ['conv2d_608[0][0]']
Normalization)
batch_normalization_610 (Batch (None, 10, 10, 192) 576 ['conv2d_611[0][0]']
Normalization)
batch_normalization_615 (Batch (None, 10, 10, 192) 576 ['conv2d_616[0][0]']
Normalization)
batch_normalization_616 (Batch (None, 10, 10, 192) 576 ['conv2d_617[0][0]']
Normalization)
activation_604 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_607[0][0]']
activation_607 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_610[0][0]']
activation_612 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_615[0][0]']
activation_613 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_616[0][0]']
mixed5 (Concatenate) (None, 10, 10, 768) 0 ['activation_604[0][0]',
'activation_607[0][0]',
'activation_612[0][0]',
'activation_613[0][0]']
conv2d_622 (Conv2D) (None, 10, 10, 160) 122880 ['mixed5[0][0]']
batch_normalization_621 (Batch (None, 10, 10, 160) 480 ['conv2d_622[0][0]']
Normalization)
activation_618 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_621[0][0]']
conv2d_623 (Conv2D) (None, 10, 10, 160) 179200 ['activation_618[0][0]']
batch_normalization_622 (Batch (None, 10, 10, 160) 480 ['conv2d_623[0][0]']
Normalization)
activation_619 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_622[0][0]']
conv2d_619 (Conv2D) (None, 10, 10, 160) 122880 ['mixed5[0][0]']
conv2d_624 (Conv2D) (None, 10, 10, 160) 179200 ['activation_619[0][0]']
batch_normalization_618 (Batch (None, 10, 10, 160) 480 ['conv2d_619[0][0]']
Normalization)
batch_normalization_623 (Batch (None, 10, 10, 160) 480 ['conv2d_624[0][0]']
Normalization)
activation_615 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_618[0][0]']
activation_620 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_623[0][0]']
conv2d_620 (Conv2D) (None, 10, 10, 160) 179200 ['activation_615[0][0]']
conv2d_625 (Conv2D) (None, 10, 10, 160) 179200 ['activation_620[0][0]']
batch_normalization_619 (Batch (None, 10, 10, 160) 480 ['conv2d_620[0][0]']
Normalization)
batch_normalization_624 (Batch (None, 10, 10, 160) 480 ['conv2d_625[0][0]']
Normalization)
activation_616 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_619[0][0]']
activation_621 (Activation) (None, 10, 10, 160) 0 ['batch_normalization_624[0][0]']
average_pooling2d_59 (AverageP (None, 10, 10, 768) 0 ['mixed5[0][0]']
ooling2D)
conv2d_618 (Conv2D) (None, 10, 10, 192) 147456 ['mixed5[0][0]']
conv2d_621 (Conv2D) (None, 10, 10, 192) 215040 ['activation_616[0][0]']
conv2d_626 (Conv2D) (None, 10, 10, 192) 215040 ['activation_621[0][0]']
conv2d_627 (Conv2D) (None, 10, 10, 192) 147456 ['average_pooling2d_59[0][0]']
batch_normalization_617 (Batch (None, 10, 10, 192) 576 ['conv2d_618[0][0]']
Normalization)
batch_normalization_620 (Batch (None, 10, 10, 192) 576 ['conv2d_621[0][0]']
Normalization)
batch_normalization_625 (Batch (None, 10, 10, 192) 576 ['conv2d_626[0][0]']
Normalization)
batch_normalization_626 (Batch (None, 10, 10, 192) 576 ['conv2d_627[0][0]']
Normalization)
activation_614 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_617[0][0]']
activation_617 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_620[0][0]']
activation_622 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_625[0][0]']
activation_623 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_626[0][0]']
mixed6 (Concatenate) (None, 10, 10, 768) 0 ['activation_614[0][0]',
'activation_617[0][0]',
'activation_622[0][0]',
'activation_623[0][0]']
conv2d_632 (Conv2D) (None, 10, 10, 192) 147456 ['mixed6[0][0]']
batch_normalization_631 (Batch (None, 10, 10, 192) 576 ['conv2d_632[0][0]']
Normalization)
activation_628 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_631[0][0]']
conv2d_633 (Conv2D) (None, 10, 10, 192) 258048 ['activation_628[0][0]']
batch_normalization_632 (Batch (None, 10, 10, 192) 576 ['conv2d_633[0][0]']
Normalization)
activation_629 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_632[0][0]']
conv2d_629 (Conv2D) (None, 10, 10, 192) 147456 ['mixed6[0][0]']
conv2d_634 (Conv2D) (None, 10, 10, 192) 258048 ['activation_629[0][0]']
batch_normalization_628 (Batch (None, 10, 10, 192) 576 ['conv2d_629[0][0]']
Normalization)
batch_normalization_633 (Batch (None, 10, 10, 192) 576 ['conv2d_634[0][0]']
Normalization)
activation_625 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_628[0][0]']
activation_630 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_633[0][0]']
conv2d_630 (Conv2D) (None, 10, 10, 192) 258048 ['activation_625[0][0]']
conv2d_635 (Conv2D) (None, 10, 10, 192) 258048 ['activation_630[0][0]']
batch_normalization_629 (Batch (None, 10, 10, 192) 576 ['conv2d_630[0][0]']
Normalization)
batch_normalization_634 (Batch (None, 10, 10, 192) 576 ['conv2d_635[0][0]']
Normalization)
activation_626 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_629[0][0]']
activation_631 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_634[0][0]']
average_pooling2d_60 (AverageP (None, 10, 10, 768) 0 ['mixed6[0][0]']
ooling2D)
conv2d_628 (Conv2D) (None, 10, 10, 192) 147456 ['mixed6[0][0]']
conv2d_631 (Conv2D) (None, 10, 10, 192) 258048 ['activation_626[0][0]']
conv2d_636 (Conv2D) (None, 10, 10, 192) 258048 ['activation_631[0][0]']
conv2d_637 (Conv2D) (None, 10, 10, 192) 147456 ['average_pooling2d_60[0][0]']
batch_normalization_627 (Batch (None, 10, 10, 192) 576 ['conv2d_628[0][0]']
Normalization)
batch_normalization_630 (Batch (None, 10, 10, 192) 576 ['conv2d_631[0][0]']
Normalization)
batch_normalization_635 (Batch (None, 10, 10, 192) 576 ['conv2d_636[0][0]']
Normalization)
batch_normalization_636 (Batch (None, 10, 10, 192) 576 ['conv2d_637[0][0]']
Normalization)
activation_624 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_627[0][0]']
activation_627 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_630[0][0]']
activation_632 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_635[0][0]']
activation_633 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_636[0][0]']
mixed7 (Concatenate) (None, 10, 10, 768) 0 ['activation_624[0][0]',
'activation_627[0][0]',
'activation_632[0][0]',
'activation_633[0][0]']
conv2d_640 (Conv2D) (None, 10, 10, 192) 147456 ['mixed7[0][0]']
batch_normalization_639 (Batch (None, 10, 10, 192) 576 ['conv2d_640[0][0]']
Normalization)
activation_636 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_639[0][0]']
conv2d_641 (Conv2D) (None, 10, 10, 192) 258048 ['activation_636[0][0]']
batch_normalization_640 (Batch (None, 10, 10, 192) 576 ['conv2d_641[0][0]']
Normalization)
activation_637 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_640[0][0]']
conv2d_638 (Conv2D) (None, 10, 10, 192) 147456 ['mixed7[0][0]']
conv2d_642 (Conv2D) (None, 10, 10, 192) 258048 ['activation_637[0][0]']
batch_normalization_637 (Batch (None, 10, 10, 192) 576 ['conv2d_638[0][0]']
Normalization)
batch_normalization_641 (Batch (None, 10, 10, 192) 576 ['conv2d_642[0][0]']
Normalization)
activation_634 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_637[0][0]']
activation_638 (Activation) (None, 10, 10, 192) 0 ['batch_normalization_641[0][0]']
conv2d_639 (Conv2D) (None, 4, 4, 320) 552960 ['activation_634[0][0]']
conv2d_643 (Conv2D) (None, 4, 4, 192) 331776 ['activation_638[0][0]']
batch_normalization_638 (Batch (None, 4, 4, 320) 960 ['conv2d_639[0][0]']
Normalization)
batch_normalization_642 (Batch (None, 4, 4, 192) 576 ['conv2d_643[0][0]']
Normalization)
activation_635 (Activation) (None, 4, 4, 320) 0 ['batch_normalization_638[0][0]']
activation_639 (Activation) (None, 4, 4, 192) 0 ['batch_normalization_642[0][0]']
max_pooling2d_27 (MaxPooling2D (None, 4, 4, 768) 0 ['mixed7[0][0]']
)
mixed8 (Concatenate) (None, 4, 4, 1280) 0 ['activation_635[0][0]',
'activation_639[0][0]',
'max_pooling2d_27[0][0]']
conv2d_648 (Conv2D) (None, 4, 4, 448) 573440 ['mixed8[0][0]']
batch_normalization_647 (Batch (None, 4, 4, 448) 1344 ['conv2d_648[0][0]']
Normalization)
activation_644 (Activation) (None, 4, 4, 448) 0 ['batch_normalization_647[0][0]']
conv2d_645 (Conv2D) (None, 4, 4, 384) 491520 ['mixed8[0][0]']
conv2d_649 (Conv2D) (None, 4, 4, 384) 1548288 ['activation_644[0][0]']
batch_normalization_644 (Batch (None, 4, 4, 384) 1152 ['conv2d_645[0][0]']
Normalization)
batch_normalization_648 (Batch (None, 4, 4, 384) 1152 ['conv2d_649[0][0]']
Normalization)
activation_641 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_644[0][0]']
activation_645 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_648[0][0]']
conv2d_646 (Conv2D) (None, 4, 4, 384) 442368 ['activation_641[0][0]']
conv2d_647 (Conv2D) (None, 4, 4, 384) 442368 ['activation_641[0][0]']
conv2d_650 (Conv2D) (None, 4, 4, 384) 442368 ['activation_645[0][0]']
conv2d_651 (Conv2D) (None, 4, 4, 384) 442368 ['activation_645[0][0]']
average_pooling2d_61 (AverageP (None, 4, 4, 1280) 0 ['mixed8[0][0]']
ooling2D)
conv2d_644 (Conv2D) (None, 4, 4, 320) 409600 ['mixed8[0][0]']
batch_normalization_645 (Batch (None, 4, 4, 384) 1152 ['conv2d_646[0][0]']
Normalization)
batch_normalization_646 (Batch (None, 4, 4, 384) 1152 ['conv2d_647[0][0]']
Normalization)
batch_normalization_649 (Batch (None, 4, 4, 384) 1152 ['conv2d_650[0][0]']
Normalization)
batch_normalization_650 (Batch (None, 4, 4, 384) 1152 ['conv2d_651[0][0]']
Normalization)
conv2d_652 (Conv2D) (None, 4, 4, 192) 245760 ['average_pooling2d_61[0][0]']
batch_normalization_643 (Batch (None, 4, 4, 320) 960 ['conv2d_644[0][0]']
Normalization)
activation_642 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_645[0][0]']
activation_643 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_646[0][0]']
activation_646 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_649[0][0]']
activation_647 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_650[0][0]']
batch_normalization_651 (Batch (None, 4, 4, 192) 576 ['conv2d_652[0][0]']
Normalization)
activation_640 (Activation) (None, 4, 4, 320) 0 ['batch_normalization_643[0][0]']
mixed9_0 (Concatenate) (None, 4, 4, 768) 0 ['activation_642[0][0]',
'activation_643[0][0]']
concatenate_12 (Concatenate) (None, 4, 4, 768) 0 ['activation_646[0][0]',
'activation_647[0][0]']
activation_648 (Activation) (None, 4, 4, 192) 0 ['batch_normalization_651[0][0]']
mixed9 (Concatenate) (None, 4, 4, 2048) 0 ['activation_640[0][0]',
'mixed9_0[0][0]',
'concatenate_12[0][0]',
'activation_648[0][0]']
conv2d_657 (Conv2D) (None, 4, 4, 448) 917504 ['mixed9[0][0]']
batch_normalization_656 (Batch (None, 4, 4, 448) 1344 ['conv2d_657[0][0]']
Normalization)
activation_653 (Activation) (None, 4, 4, 448) 0 ['batch_normalization_656[0][0]']
conv2d_654 (Conv2D) (None, 4, 4, 384) 786432 ['mixed9[0][0]']
conv2d_658 (Conv2D) (None, 4, 4, 384) 1548288 ['activation_653[0][0]']
batch_normalization_653 (Batch (None, 4, 4, 384) 1152 ['conv2d_654[0][0]']
Normalization)
batch_normalization_657 (Batch (None, 4, 4, 384) 1152 ['conv2d_658[0][0]']
Normalization)
activation_650 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_653[0][0]']
activation_654 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_657[0][0]']
conv2d_655 (Conv2D) (None, 4, 4, 384) 442368 ['activation_650[0][0]']
conv2d_656 (Conv2D) (None, 4, 4, 384) 442368 ['activation_650[0][0]']
conv2d_659 (Conv2D) (None, 4, 4, 384) 442368 ['activation_654[0][0]']
conv2d_660 (Conv2D) (None, 4, 4, 384) 442368 ['activation_654[0][0]']
average_pooling2d_62 (AverageP (None, 4, 4, 2048) 0 ['mixed9[0][0]']
ooling2D)
conv2d_653 (Conv2D) (None, 4, 4, 320) 655360 ['mixed9[0][0]']
batch_normalization_654 (Batch (None, 4, 4, 384) 1152 ['conv2d_655[0][0]']
Normalization)
batch_normalization_655 (Batch (None, 4, 4, 384) 1152 ['conv2d_656[0][0]']
Normalization)
batch_normalization_658 (Batch (None, 4, 4, 384) 1152 ['conv2d_659[0][0]']
Normalization)
batch_normalization_659 (Batch (None, 4, 4, 384) 1152 ['conv2d_660[0][0]']
Normalization)
conv2d_661 (Conv2D) (None, 4, 4, 192) 393216 ['average_pooling2d_62[0][0]']
batch_normalization_652 (Batch (None, 4, 4, 320) 960 ['conv2d_653[0][0]']
Normalization)
activation_651 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_654[0][0]']
activation_652 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_655[0][0]']
activation_655 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_658[0][0]']
activation_656 (Activation) (None, 4, 4, 384) 0 ['batch_normalization_659[0][0]']
batch_normalization_660 (Batch (None, 4, 4, 192) 576 ['conv2d_661[0][0]']
Normalization)
activation_649 (Activation) (None, 4, 4, 320) 0 ['batch_normalization_652[0][0]']
mixed9_1 (Concatenate) (None, 4, 4, 768) 0 ['activation_651[0][0]',
'activation_652[0][0]']
concatenate_13 (Concatenate) (None, 4, 4, 768) 0 ['activation_655[0][0]',
'activation_656[0][0]']
activation_657 (Activation) (None, 4, 4, 192) 0 ['batch_normalization_660[0][0]']
mixed10 (Concatenate) (None, 4, 4, 2048) 0 ['activation_649[0][0]',
'mixed9_1[0][0]',
'concatenate_13[0][0]',
'activation_657[0][0]']
conv2d_662 (Conv2D) (None, 2, 2, 128) 2359424 ['mixed10[0][0]']
batch_normalization_661 (Batch (None, 2, 2, 128) 512 ['conv2d_662[0][0]']
Normalization)
global_average_pooling2d_3 (Gl (None, 128) 0 ['batch_normalization_661[0][0]']
obalAveragePooling2D)
dropout_6 (Dropout) (None, 128) 0 ['global_average_pooling2d_3[0][0
]']
dense_6 (Dense) (None, 1024) 132096 ['dropout_6[0][0]']
dropout_7 (Dropout) (None, 1024) 0 ['dense_6[0][0]']
dense_7 (Dense) (None, 256) 262400 ['dropout_7[0][0]']
dropout_8 (Dropout) (None, 256) 0 ['dense_7[0][0]']
dense_8 (Dense) (None, 7) 1799 ['dropout_8[0][0]']
==================================================================================================
Total params: 24,559,015
Trainable params: 24,524,327
Non-trainable params: 34,688
__________________________________________________________________________________________________
None
In [3]:
# Define the GradCAM function
from tensorflow.keras import backend as K
def mse_loss(y_true, y_pred, loss_function=None):
return tf.reduce_mean(tf.square(y_true - y_pred))
def gradcam(img, model, layer_name):
# Expand the dimensions of the input image to represent the batch size
img = tf.expand_dims(img, axis=0)
# Retrieve the output of the specified layer for the input image
last_conv_layer_output = model.get_layer(layer_name).output
# Define a function to compute the gradient of the predicted class with respect to the activations of the last convolutional layer
grad_model = Model([model.inputs], [model.output, last_conv_layer_output])
with tf.GradientTape() as tape:
preds, last_conv_layer_output = grad_model(img)
class_output = preds[:, np.argmax(preds[0])]
# Compute the gradients of the class output with respect to the activations of the last convolutional layer
grads = tape.gradient(class_output, last_conv_layer_output)
# Compute the vector of weights as the global average pooling of the gradients
pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2))
# Compute the weighted combination of the activations of the last convolutional layer
last_conv_layer_output = last_conv_layer_output[0]
heatmap = tf.reduce_mean(last_conv_layer_output * tf.expand_dims(pooled_grads, axis=0), axis=-1)
# Normalize the heatmap
heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap)
return heatmap.numpy()
In [15]:
for i, image_id in enumerate(test_images):
img_path = 'DataSet/Combined/' + image_id
img = cv2.imread(img_path)
img = cv2.resize(img, img_size)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # Convert to RGB
img = img / 255.0 # Normalize
# Fetch the diagnosis for the current image
diagnosis = df[df['image_id'] == image_id]['dx'].values[0]
# Generate the GradCAM
cam = gradcam(img, resnet_model, 'conv2d_621')
# Display the original image, GradCAM, and heatmap with 'jet' colormap and colorbar
plt.figure(figsize=(18, 6))
# Original Image
plt.subplot(1, 3, 1)
plt.imshow(img)
plt.title(f"Original Image ({diagnosis})")
plt.axis('off')
# GradCAM Result
plt.subplot(1, 3, 2)
plt.imshow(cam, cmap='jet')
plt.title("GradCAM Result")
plt.axis('off')
# Heatmap Overlay
plt.subplot(1, 3, 3)
heatmap_plot = plt.imshow(cam, cmap='jet')
plt.colorbar(heatmap_plot)
plt.title("Heatmap with 'jet' Colormap and Colorbar")
plt.axis('off')
plt.show()